package ch07
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;

	import utils.Ball;

	/**
	 * 投掷.
	 * 计算拖拽的距离与应用速度向量的原理是相互对应的。
	 * 在应用速度向量时，我们将速度向量加到物体原坐标的位置上，从而形成新的位置，所以这个公式可以写成：旧的位置 + 速度向量 = 新的位置。
	 * 为了计算出移动的速度向量，只需要将这个等式做一个简单的变形：速度向量 = 新位置– 旧位置。
	 *
	 * 在拖拽影片时，会在每一帧形成新的位置。用当前帧的位置减去前一帧的位置，就可知道这一帧所移动的距离。这就是每帧移动距离的速度向量！
	 * @author sjp
	 *
	 */
	public class Throwing extends Sprite
	{
		private var ball:Ball;

		private var vx:Number;
		private var vy:Number;
		//弹性系数,为了制造能量的损失，可以用弹性系数作为阻力。
		private var bounce:Number=-0.7;
		//重力加速度
		private var gravity:Number=.5;
		//存储旧的 x,y 位置
		private var oldX:Number;
		private var oldY:Number;

		public function Throwing()
		{
			init();
		}

		private function init():void
		{
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			ball=new Ball();
			ball.x=stage.stageWidth / 2;
			ball.y=stage.stageHeight / 2;
			vx=Math.random() * 10 - 5;
			vy=-10;
			addChild(ball);
			ball.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void
		{
			vy+=gravity;
			ball.x+=vx;
			ball.y+=vy;
			var left:Number=0;
			var right:Number=stage.stageWidth;
			var top:Number=0;
			var bottom:Number=stage.stageHeight;
			if (ball.x + ball.radius > right)
			{
				ball.x=right - ball.radius;
				vx*=bounce;
			}
			else if (ball.x - ball.radius < left)
			{
				ball.x=left + ball.radius;
				vx*=bounce;
			}
			if (ball.y + ball.radius > bottom)
			{
				ball.y=bottom - ball.radius;
				vy*=bounce;
			}
			else if (ball.y - ball.radius < top)
			{
				ball.y=top + ball.radius;
				vy*=bounce;
			}
		}

		private function onMouseDown(event:MouseEvent):void
		{
			oldX=ball.x;
			oldY=ball.y;
			stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			ball.startDrag();
			removeEventListener(Event.ENTER_FRAME, onEnterFrame);
			addEventListener(Event.ENTER_FRAME, trackVelocity);
		}

		private function onMouseUp(event:MouseEvent):void
		{
			stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
			ball.stopDrag();
			removeEventListener(Event.ENTER_FRAME, trackVelocity);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		/**
		 * 在拖拽影片时，会在每一帧形成新的位置。
		 * 用当前帧的位置减去前一帧的位置，就可知道这一帧所移动的距离。这就是每帧移动距离的速度向量！
		 * */
		private function trackVelocity(event:Event):void
		{
			vx=ball.x - oldX;
			vy=ball.y - oldY;
			oldX=ball.x;
			oldY=ball.y;
		}
	}
}